/* 
 * File:   buffer.h
 * Author: Tomás R. González Barroso  
 * Diseño de sistemas Operativos
 *
 * Created on 27 de junio de 2013, 8:34
 */
#include "comun.h"
#include <sys/types.h>

#ifndef BUFFER_H
#define	BUFFER_H

typedef struct buffer buffer;
struct buffer {
    int id;                         // Id buffer
    ino_t inode;                    // file inode
    int block;                      // nº bloque    
    int status_locked;              // locked status
    int status_valid;               // valid status    
    int status_delayed;             // delayed status
    long tam;                       // data length <= BLKSIZE
    int pid;                        // process identifier
    int fd;                         // accessed file descriptor
    int freenext;                   // free list next node
    int freeprev;                   // free list previous node
    int hashnext;                   // hash list next node
    int hashprev;                   // hash list prev node
    int sleep[MAXSLEEP];            // slept processes        
    char data[BLKSIZE];             // buffer data
};

//Devolvemos un buffer, nuevo o ya en buffer_cache
buffer *getblk(int fs, ino_t inode, int block);

//Buffer ocupado o no libres, nos quedamos a la espera de señal 
void bwait(buffer *buff);

//Liberamos buffer
void brelease(buffer *buff);

//Marcamos buffer con escritura retardada
void bwrite(buffer *buff);

//Leemos de disco el tamaño de un buffer
//Solicitaremos para ello buffer libre -> getblk
buffer *bread(int fs, ino_t inode, int block,int fd);

//Mandamos a escribir el bloque a disco
//si somos el proceso propietario del primer buffer libre
void basyncwrite();

//Escribimos el buffer fisicamente en disco
void bwritedisc(buffer *tmp_buffer);

//Leemos desde disco el buffer
void breaddisc(buffer *tmp_buffer,int fd);

//Guaramos a disco todos los buffers del proceso y fd indicado 
//con escritura retardada
void bwrite_fclose(int pid,int fd);

//Visualizamos datos buffer
void bprint(buffer *buff);

//Calculamos nº de bloque segun tamaño del mismo
int bmap(off_t io);

#endif	/* BUFFER_H */

